package cjyyp.入门;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringEncoder;

import java.util.Date;

/**
 * * 1 处，创建 NioEventLoopGroup，同 Server
 *
 * * 2 处，选择客户 Socket 实现类，NioSocketChannel 表示基于 NIO 的客户端实现
 *
 * * 3 处，添加 SocketChannel 的处理器，ChannelInitializer 处理器（仅执行一次），它的作用是待客户端 SocketChannel 建立连接后，执行 initChannel 以便添加更多的处理器
 *
 * * 4 处，指定要连接的服务器和端口
 *
 * * 5 处，Netty 中很多方法都是异步的，如 connect，这时需要使用 sync 方法等待 connect 建立连接完毕
 *
 * * 6 处，获取 channel 对象，它即为通道抽象，可以进行数据读写操作
 *
 * * 7 处，写入消息并清空缓冲区
 *
 * * 8 处，消息会经过通道 handler 处理，这里是将 String => ByteBuf 发出
 *
 * * 数据经过网络传输，到达服务器端，服务器端 5 和 6 处的 handler 先后被触发，走完一个流程
 */
public class 初始netty客户端 {
    public static void main(String[] args) throws InterruptedException {
        new Bootstrap()
                .group(new NioEventLoopGroup()) // 1
                .channel(NioSocketChannel.class) // 2
                .handler(new ChannelInitializer<Channel>() { // 3
                    @Override
                    protected void initChannel(Channel ch) {
                        ch.pipeline().addLast(new StringEncoder()); // 8
                    }
                })
                .connect("127.0.0.1", 8080) // 4
                .sync() // 5
                .channel() // 6
                .writeAndFlush(new Date() + ": hello world!"); // 7
    }
}
